// 36 有效的数独
//leetcode.cn/problems/valid-sudoku/description/

/**
 * 
 [["5","3",".",".","7",".",".",".","."],["6",".",".","1","9","5",".",".","."],[".","9","8",".",".",".",".","6","."],["8",".",".",".","6",".",".",".","3"],["4",".",".","8",".","3",".",".","1"],["7",".",".",".","2",".",".",".","6"],[".","6",".",".",".",".","2","8","."],[".",".",".","4","1","9",".",".","5"],[".",".",".",".","8",".",".","7","9"]]

[["8","3",".",".","7",".",".",".","."],["6",".",".","1","9","5",".",".","."],[".","9","8",".",".",".",".","6","."],["8",".",".",".","6",".",".",".","3"],["4",".",".","8",".","3",".",".","1"],["7",".",".",".","2",".",".",".","6"],[".","6",".",".",".",".","2","8","."],[".",".",".","4","1","9",".",".","5"],[".",".",".",".","8",".",".","7","9"]]
 * 
 */

/**
 * @param {character[][]} board
 * @return {boolean}
 */
var isValidSudoku = function (board) {
    for (var i = 0; i < 9; i++) {
        // 检查所有行不重复
        var line = board[i];
        if (!checkLineValid(line)) {
            return false;
        }

        // 检查所有列不重复
        var column = [];
        for (let j = 0; j < 9; j++) {
            column.push(board[j][i]);
        }

        if (!checkLineValid(column)) {
            return false;
        }

        // 检查一个九宫格不重复
        var jiugong = [];
        for (let j = 0; j < 9; j++) {
            var r_index = Math.floor(i / 3) * 3 + Math.floor(j / 3);
            var c_index = (j % 3) + (i % 3) * 3;

            jiugong.push(board[r_index][c_index]);
        }

        if (!checkLineValid(jiugong)) {
            return false;
        }
    }

    return true;
};

var checkLineValid = function (line) {
    var arr = [];
    for (var i = 0; i < 9; i++) {
        var n = line[i];
        if (n === '.') {
            continue;
        }

        for (var j = 0; j < arr.length; j++) {
            if (arr[j] === n) {
                // console.log(line);
                return false;
            }
        }

        arr.push(n);
    }

    return true;
};

let testArr = [
    ['5', '3', '.', '.', '7', '.', '.', '.', '.'],
    ['6', '.', '.', '1', '9', '5', '.', '.', '.'],
    ['.', '9', '8', '.', '.', '.', '.', '6', '.'],
    ['8', '.', '.', '.', '6', '.', '.', '.', '3'],
    ['4', '.', '.', '8', '.', '3', '.', '.', '1'],
    ['7', '.', '.', '.', '2', '.', '.', '.', '6'],
    ['.', '6', '.', '.', '.', '.', '2', '8', '.'],
    ['.', '.', '.', '4', '1', '9', '.', '.', '5'],
    ['.', '.', '.', '.', '8', '.', '.', '7', '9'],
];

isValidSudoku(testArr);
